home *** CD-ROM | disk | FTP | other *** search
- /* Ch-Drive command for Windows NT operating system
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Bug:
- the code will not work if you have more drives than those that
- can fit in a panel.
- */
-
- #ifndef _OS_NT
- #error This file is for the NT operating system.
- #else
-
- #include <config.h>
- #include <windows.h>
- #include <string.h>
- #include <stdio.h>
- #include "tty.h"
- #include "mad.h"
- #include "util.h"
- #include "win.h"
- #include "color.h"
- #include "dlg.h"
- #include "widget.h"
- #include "dialog.h" /* For do_refresh() */
-
- #include "dir.h"
- #include "panel.h" /* Needed for the externs */
- #include "file.h"
- #include "main.h"
-
- struct Dlg_head *drive_dlg;
- WPanel *this_panel;
-
- static int drive_dlg_callback (Dlg_head *h, int Par, int Msg);
- static void drive_dlg_refresh (void);
- static void drive_cmd();
-
- #define B_DRIVE_BASE 100
-
- void drive_cmd_a()
- {
- this_panel = left_panel;
- drive_cmd();
- }
- void drive_cmd_b()
- {
- this_panel = right_panel;
- drive_cmd();
- }
-
- static void drive_cmd()
- {
- int i, nNewDrive, nDrivesAvail;
- char szTempBuf[7], szDrivesAvail[256], *p; /* mmm... this is bad practice... (256) */
-
- /* Get drives name and count */
- GetLogicalDriveStrings (255, szDrivesAvail);
- for (nDrivesAvail=0, p=szDrivesAvail; *p; nDrivesAvail++)
- p+=4;
-
- /* Create Dialog */
- do_refresh ();
- drive_dlg = create_dlg ((LINES-6)/2-3, /* Center on y */
- this_panel->widget.x + (this_panel->widget.cols - nDrivesAvail*6)/2, /* Center on x, relative to panel */
- 6, nDrivesAvail*6, dialog_colors,
- drive_dlg_callback, "[ChDrive]", "drive", DLG_NONE);
- x_set_dialog_title (drive_dlg, "Change Drive");
-
- /* Add a button for each drive */
- for (i = 0; i < nDrivesAvail; i++) {
- p -= 4;
- sprintf (szTempBuf, "[ %c ]", *p);
- add_widgetl (drive_dlg, button_new (3, (nDrivesAvail-i-1)*5+3, B_DRIVE_BASE+(szTempBuf[2]-'A'),
- szTempBuf, szTempBuf[2], 2, NULL, NULL), XV_WLAY_RIGHTOF);
- }
-
- run_dlg(drive_dlg);
-
- /* do action */
- if (drive_dlg->ret_value != B_CANCEL) {
- nNewDrive = drive_dlg->ret_value - B_DRIVE_BASE;
- SetCurrentDirectory(szDrivesAvail+(nNewDrive*4)); /* TODO: Should not take you always to root dir*/
- getcwd (this_panel->cwd, sizeof (this_panel->cwd)-2);
- if (*(szDrivesAvail+(nNewDrive*4)) == toupper(*(this_panel->cwd))) {
- clean_dir (&this_panel->dir, this_panel->count);
- this_panel->count = do_load_dir (&this_panel->dir, this_panel->sort_type, this_panel->reverse, this_panel->case_sensitive, this_panel->filter);
- this_panel->top_file = 0;
- this_panel->selected = 0;
- this_panel->marked = 0;
- this_panel->total = 0;
- show_dir(this_panel);
- reread_cmd();
- } else
- message (1, " Error ", " Can't access drive %s: \n", (szDrivesAvail+(nNewDrive*4)) );
- }
- destroy_dlg (drive_dlg);
- repaint_screen ();
- }
-
- static int drive_dlg_callback (Dlg_head *h, int Par, int Msg)
- {
- char buffer [10];
-
- switch (Msg) {
- #ifndef HAVE_X
- case DLG_DRAW:
- drive_dlg_refresh ();
- break;
- #endif
- }
- return 0;
- }
-
- static void drive_dlg_refresh (void)
- {
- attrset (dialog_colors[0]);
- dlg_erase (drive_dlg);
- draw_box (drive_dlg, 1, 1, drive_dlg->lines-2, drive_dlg->cols-2);
-
- attrset (dialog_colors[2]);
- dlg_move (drive_dlg, 1, drive_dlg->cols/2 - 7);
- addstr (" Change Drive ");
- }
-
- #endif
-